package com.company.设计模式.单例模式;

/**
 * @Classname Singleton4
 * @Description 双重校验锁 线程安全
 * 著作权归https://pdai.tech所有。
 * 链接：https://www.pdai.tech/md/dev-spec/pattern/2_singleton.html
 *
 * 加锁操作只需要对实例化那部分的代码进行，只有当 uniqueInstance 没有被实例化时，才需要进行加锁。
 * 双重校验锁先判断 uniqueInstance 是否已经被实例化，如果没有被实例化，那么才对实例化语句进行加锁。
 * @Date 2021/9/10 10:38
 * @Created by ylr
 */
public class Singleton4 {
    /**
     * * uniqueInstance 采用 volatile 关键字修饰也是很有必要的。
     * uniqueInstance = new Singleton(); 这段代码其实是分为三步执行。
     * 分配内存空间
     * 初始化对象
     * 将 uniqueInstance 指向分配的内存地址
    * */
    private static volatile Singleton4 uniqueInstance;

    private Singleton4(){

    }

    public static Singleton4 getUniqueInstance(){
        if (uniqueInstance == null){
            synchronized (Singleton4.class){ //所有线程需要的锁都是同一把
                if (uniqueInstance==null){
                    uniqueInstance = new Singleton4();
                }
            }
        }
        return uniqueInstance;

    }


}
